#include "Laka.h"

using namespace std;

Laka::Laka(string i, string o) {
	 odczytzapis = new OdczytZapis(i, o);
	 zwierzeta=odczytzapis-> wczytajDaneZPliku();
}


void Laka::symuluj(int ileM){
	
	for (int i=0; i<ileM; i++) {
		cout << i << endl;
		wykonajMiesiac(i);
	}
	
}

void Laka::wykonajMiesiac(int nrAktualMies) {
	wykonajKrzyzowanie(nrAktualMies);
//	ostatniaWieczerza();
//	usmiercNajslabszeOgniwa();
}

void Laka::zapiszWyniki() {
	odczytzapis ->zapiszDaneDoPliku(zwierzeta);
}

void Laka::wykonajKrzyzowanie(int nrAktualMies) {
	ListaZwierzat noweZwierzeta;
		if (zwierzeta -> poczatek == NULL) {
			cout<<"Pusta lista"<<endl;
		} else {
			ElListy *tmp_wsk = zwierzeta -> poczatek;
			while (tmp_wsk != NULL) {
				Zwierze* aktualneZwierze = tmp_wsk->zwierze ;
//				cout << "Probujemy krzyzowac " << aktualneZwierze -> gatunek() << endl;
//				cout << "czy moze sie rozmnazac? " << (aktualneZwierze->czyMozeSieRozmn(nrAktualMies) ? "tak" : "nie") << endl;
				if (aktualneZwierze->czyMozeSieRozmn(nrAktualMies)) {
//				cout << "krzyzujemy " << aktualneZwierze->gatunek() << " i " << znajdzPartnera(aktualneZwierze, nrAktualMies)->gatunek() << endl;
					Zwierze *partner = znajdzPartnera(aktualneZwierze, nrAktualMies);
					Zwierze* dziecko = aktualneZwierze->krzyzuj(partner);
					if (dziecko !=NULL) {
						dziecko -> nrMiesiacaGdyOstRozmn = nrAktualMies;
						noweZwierzeta += dziecko;
					}
					
					aktualneZwierze -> nrMiesiacaGdyOstRozmn = nrAktualMies;
					partner -> nrMiesiacaGdyOstRozmn = nrAktualMies;
					
				}
				tmp_wsk = tmp_wsk -> nast;
			}
		}
		
		(*zwierzeta) += &noweZwierzeta;
}

Zwierze* Laka::znajdzPartnera(Zwierze* pierPolowka, int nrAktualMies) {
//				cout << "cszukamy partnera dla  " << pierPolowka->gatunek() << endl;
	if (zwierzeta -> poczatek == NULL) {
			cout<<"Pusta lista"<<endl;
		} else {
			ElListy *tmp_wsk = zwierzeta -> poczatek;
			while (tmp_wsk != NULL) {
				Zwierze* aktualneZwierze = tmp_wsk->zwierze ;
//				cout << "probujemy z: " << aktualneZwierze->gatunek() << endl;
//				cout << "czy moze? " << (aktualneZwierze->czyMozeSieRozmn(nrAktualMies) ? "tak" : "nie") << endl;
				if  (aktualneZwierze->czyMozeSieRozmn(nrAktualMies)) {
//				cout << "czy moze byc partnerem? " << (pierPolowka->czyMozeBycPartnerem(aktualneZwierze, nrAktualMies)  ? "tak" : "nie") << endl;
					if (pierPolowka->czyMozeBycPartnerem(aktualneZwierze, nrAktualMies)){
						return aktualneZwierze;
					}
				}
				tmp_wsk = tmp_wsk -> nast;
			}
		}
		return NULL;
}





